 /*****************************************************************************
      COPYRIGHT: 2009 Edan Instruments,	Inc. All rights	reserved
    PROJECTNAME: Mx
        VERSION: 1.0
       FILENAME: GetChar.java
        CREATED: 2009-09-01
         AUTHOR: Wu Yin
    DESCRIPTION: 从文本文件中摘出其中用到的字符，删除重复的，并排序。
                 用Java实现是因为C++不支持识别Unicode的中文字符
           编译: javac GetChar.java
           运行: java GetChar "file_name"

           TODO: 很奇怪，汉字的“口”字有一次被该程序过滤掉，不知道还有没有其他汉字
                 会被过滤掉？
******************************************************************************/
import  java.io.FileInputStream;
import  java.io.InputStream;
import  java.util.*;

public class GetChar
{
	public static void main(String[] args)
	{
		try
		{
			// 从命令行的第一个参数得到要读取的文件名
			InputStream r = new FileInputStream(args[0]);
			// TODO: 数组的大小不好确定
			byte tmp[] = new byte[1024*1024];
			// 将文件以字节的形式读入内存
			r.read(tmp);
			// 将字节形式的信息按照UTF-8编码重新组织
			String str = new String(tmp, "utf8");

			// 字符串的长度，一个汉字的长度为1
			int len = str.trim().length();
			// 最终存放字符的“有序集合”
			SortedSet<String> words = new TreeSet<String>();
			for(int n=0; n<len; n++)
			{
				// 将char类型转换为String类型
				String temp_str = String.valueOf(str.charAt(n));
				// 删除其中的回车、换行、空格
				if(temp_str.equals("\n") || temp_str.equals("\r") || temp_str.equals(" "))
				{
					continue;
				}
				words.add(temp_str);
			}

			// 输出集合中所有的字符
			Iterator<String> iter = words.iterator();
			for(int n=0; n<words.size(); n++)
			{
				// 输出没有重复字符的字符串，后面有个空格分隔
				System.out.print(iter.next() + " ");
			}
			System.out.println();
		}
		catch(Exception e)
		{
			// TODO: handle exception
		}
	}
}
